package ctrl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import model.Anfrage;
import model.LoginCredentials;
import model.Person;
import model.SimpleMail;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import dao.AnfrageDao;
import dao.PersonDao;

@Controller
public class AnfrageController {
	private static Logger log = Logger.getLogger(AnfrageController.class);
	private AnfrageDao anfrageDao = null;
	private PersonDao personDao = null;
	private LoginCredentials loginCredentials = null;

	public void setAnfrageDao(AnfrageDao AnfrageDao) {
		this.anfrageDao = AnfrageDao;
	}

	public void setPersonDao(PersonDao personDao) {
		this.personDao = personDao;
	}

	public void setLoginCredentials(LoginCredentials loginCredentials) {
		this.loginCredentials = loginCredentials;
	}

	@RequestMapping(value = "/Meine_Anfragen.html", method = RequestMethod.GET)
	public ModelAndView show_requests() {
		ModelAndView mv = new ModelAndView();

		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");
		Person select_person = new Person();

		select_person.setId(loginCredentials.getId());

		List<Anfrage> g_anfragen = anfrageDao
				.getAnfragebySuchender(select_person);
		List<Anfrage> e_anfragen = anfrageDao
				.getAnfragebyAnbieter(select_person);
		mv.addObject("title", "Meine Anfragen");

		mv.addObject("file", "showmyrequests.jsp");
		mv.addObject("g_anfragen", g_anfragen);
		mv.addObject("e_anfragen", e_anfragen);
		mv.addObject("formatdatum", formatdatum);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/Popup_Bewertung.html", method = RequestMethod.POST)
	public ModelAndView popup_rating(
			@RequestParam(value = "id", required = true) int id) {
		ModelAndView mv = new ModelAndView();

		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");
		Person select_person = new Person();
		Boolean show_popup = true;

		select_person.setId(loginCredentials.getId());

		List<Anfrage> g_anfragen = anfrageDao
				.getAnfragebySuchender(select_person);
		List<Anfrage> e_anfragen = anfrageDao
				.getAnfragebyAnbieter(select_person);
		mv.addObject("title", "Meine Anfragen");

		mv.addObject("file", "showmyrequests.jsp");
		mv.addObject("g_anfragen", g_anfragen);
		mv.addObject("e_anfragen", e_anfragen);
		mv.addObject("formatdatum", formatdatum);
		mv.addObject("anfrage_id", id);
		mv.addObject("show_popup", show_popup);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/GenehmigeAnfrage.html", method = RequestMethod.GET)
	public ModelAndView confirmrequest(
			@RequestParam(value = "id", required = true) int id) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();
		Person select_person = new Person();
		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");

		Anfrage confirmRequest = anfrageDao.findById(id);
		confirmRequest.setGenehmigt(true);

		try {
			anfrageDao.save(confirmRequest);
			msg = "Anfrage erfolgreich bestätigt";

			// User per mail informieren
			// Person anbieter = new Person();
			// anbieter = confirmRequest.getAnbieter();

			SimpleMail sm = new SimpleMail();
			String email = confirmRequest.getAnbieter().getEMail();
			String inhalt = "Ihre Anfrage im Couchsurfing-Portal (http://localhost:8080/couchsurfing/) wurde bestätigt!\n\n";
			inhalt += "Details zur Anfrage:\n";
			inhalt += "Anbieter: " + confirmRequest.getAnbieter().getVorname()
					+ " " + confirmRequest.getAnbieter().getNachname() + "\n";
			inhalt += "Zeitraum: " + confirmRequest.getGueltigVon() + " - "
					+ confirmRequest.getGueltigBis() + "\n";
			inhalt += "Kommentar: " + confirmRequest.getKommentar() + "\n\n";
			inhalt += "Mit freundlichen Gruessen\n";
			inhalt += "  Ihr Service-Team";
			// Email senden
			try {
				// Auskommentieren zum Senden der E-Mail :
				// sm.sendMessage(email, inhalt);
			} catch (Exception e) {
				errormsg.add("Fehler im Email-Versand!");
			}

			// Mail versenden
		} catch (Exception e) {
			errormsg.add(e.getMessage());
		}

		select_person.setId(loginCredentials.getId());

		List<Anfrage> g_anfragen = anfrageDao
				.getAnfragebySuchender(select_person);
		List<Anfrage> e_anfragen = anfrageDao
				.getAnfragebyAnbieter(select_person);
		mv.addObject("title", "Meine Anfragen");
		mv.addObject("file", "showmyrequests.jsp");
		mv.addObject("g_anfragen", g_anfragen);
		mv.addObject("e_anfragen", e_anfragen);
		mv.addObject("errormsg", errormsg);
		mv.addObject("msg", msg);
		mv.addObject("formatdatum", formatdatum);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/SaveRating.html", method = RequestMethod.GET)
	public ModelAndView save_rating(@RequestParam(value = "anfrage_id") int id,
			@RequestParam(value = "bewertung") int bewertung) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();
		Person select_person = new Person();
		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");

		Anfrage ratingRequest = anfrageDao.findById(id);
		ratingRequest.setBewertung(bewertung);

		select_person.setId(loginCredentials.getId());

		try {
			anfrageDao.save(ratingRequest);
			msg = "Bewertung erfolgreich gespeichert";
		} catch (Exception e) {
			errormsg.add(e.getMessage());
		}

		List<Anfrage> g_anfragen = anfrageDao
				.getAnfragebySuchender(select_person);
		List<Anfrage> e_anfragen = anfrageDao
				.getAnfragebyAnbieter(select_person);
		mv.addObject("title", "Meine Anfragen");
		mv.addObject("file", "showmyrequests.jsp");
		mv.addObject("g_anfragen", g_anfragen);
		mv.addObject("e_anfragen", e_anfragen);
		mv.addObject("errormsg", errormsg);
		mv.addObject("msg", msg);
		mv.addObject("formatdatum", formatdatum);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/AnlegenAnfrage.html", method = RequestMethod.GET)
	public ModelAndView create_request(@RequestParam(value = "id") int id) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();
		Person anbieter = personDao.findById(id);
		mv.addObject("title", "Neue Anfrage");
		mv.addObject("file", "createrequest.jsp");
		mv.addObject("errormsg", errormsg);
		mv.addObject("msg", msg);
		mv.addObject("anbieter", anbieter);
		mv.setViewName("home");
		return mv;
	}

	@RequestMapping(value = "/SpeichernAnfrage.html", method = RequestMethod.POST)
	public ModelAndView save_request(
			@RequestParam(value = "anbieter_id") int anbieter_id,
			@RequestParam("von") String von, @RequestParam("bis") String bis,
			@RequestParam("kommentar") String kommentar) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();
		Person anbieter = personDao.findById(anbieter_id);

		Person suchender = new Person();

		suchender = personDao.findById(loginCredentials.getId());

		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");
		Date von_datum = new Date();
		Date bis_datum = new Date();

		// Datumskonvertierung für Von und Bis Datum
		try {
			von_datum = formatdatum.parse(von);
		} catch (ParseException e) {
			// Datum fehlerhaft
			if (von != "")
				errormsg.add("Fehler bei der Datumskonvertierung");
		}

		try {
			bis_datum = formatdatum.parse(bis);
		} catch (ParseException e) {
			// Datum fehlerhaft
			if (bis != "")
				errormsg.add("Fehler bei der Datumskonvertierung");
		}

		// Datum von muss kleiner bis sein
		if (bis_datum.before(von_datum)) {
			errormsg.add("Bis Datum muss kleiner als Von Datum sein!");
		}

		if (von == "")
			errormsg.add("Bitte Von Datum füllen!");

		if (bis == "")
			errormsg.add("Bitte Bis Datum füllen!");

		if (errormsg.isEmpty()) {
			// Neue Anfrage zusammenstellen und speichern
			Anfrage newRequest = new Anfrage();
			newRequest.setAnbieter(anbieter);
			newRequest.setBewertung(0);
			newRequest.setGenehmigt(false);
			newRequest.setGueltigVon(von_datum);
			newRequest.setGueltigBis(bis_datum);
			newRequest.setKommentar(kommentar);
			newRequest.setSuchender(suchender);
			anfrageDao.save(newRequest);
			// User per mail informieren
			SimpleMail sm = new SimpleMail();
			String email = anbieter.getEMail();
			String inhalt = "Für Ihr Angebot ist eine Anfrage im Couchsurfing-Portal (http://localhost:8080/couchsurfing/) eingegangen!\n\n";
			inhalt += "Details zur Anfrage:\n";
			inhalt += "Von: " + suchender.getVorname() + " "
					+ suchender.getNachname() + "\n";
			inhalt += "Email: " + suchender.getEMail() + "\n";
			inhalt += "Zeitraum: " + von + " - " + bis + "\n";
			inhalt += "Kommentar: " + kommentar + "\n\n";
			inhalt += "Mit freundlichen Gruessen\n";
			inhalt += "  Ihr Service-Team";
			// Email senden
			try {
				// Versenden der E-Mail deaktiviert
				// sm.sendMessage(email, inhalt);
			} catch (Exception e) {
				errormsg.add("Fehler im Email-Versand!");
			}
		}

		if (errormsg.isEmpty()) {
			msg = "Anfrage erfolgreich gespeichert!";
			mv.addObject("msg", msg);
			mv.addObject("title", "Mitglieder");
			mv.addObject("message", "Unsere Mitglieder");
			mv.addObject("isLogUserAdmin", loginCredentials.getIsAdmin());
			mv.addObject("file", "list-personen.jsp");
			mv.addObject("personen", personDao.findAll());
			mv.setViewName("home");
		} else {
			mv.addObject("von", von);
			mv.addObject("bis", bis);
			mv.addObject("title", "Neue Anfrage");
			mv.addObject("file", "createrequest.jsp");
			mv.addObject("errormsg", errormsg);
			mv.addObject("msg", msg);
			mv.addObject("anbieter", anbieter);
			mv.addObject("kommentar", kommentar);
			mv.setViewName("home");
		}

		return mv;
	}

	@RequestMapping(value = "/LoescheAnfrage.html", method = RequestMethod.GET)
	public ModelAndView del_request(@RequestParam(value = "id") int id) {
		ModelAndView mv = new ModelAndView();
		String msg = "";
		List<String> errormsg = new ArrayList<String>();
		Person select_person = new Person();
		SimpleDateFormat formatdatum = new SimpleDateFormat("dd.MM.yyyy");

		select_person.setId(loginCredentials.getId());

		Anfrage delRequest = anfrageDao.findById(id);
		if (delRequest.getId() == 0) {
			errormsg.add("Anfrage existiert nicht!");
		}

		if (errormsg.isEmpty()) {
			if (delRequest.getSuchender().getId() == loginCredentials.getId()) {
				anfrageDao.delete(delRequest);
				msg = "Anfrage erfolgreich gelöscht!";
			} else {
				errormsg.add("Sie wollen eine Anfrage löschen die nicht von Ihnen ist! Dies ist nicht erlaubt!");
			}
		}
		List<Anfrage> g_anfragen = anfrageDao
				.getAnfragebySuchender(select_person);
		List<Anfrage> e_anfragen = anfrageDao
				.getAnfragebyAnbieter(select_person);
		mv.addObject("title", "Meine Anfragen");
		mv.addObject("file", "showmyrequests.jsp");
		mv.addObject("g_anfragen", g_anfragen);
		mv.addObject("e_anfragen", e_anfragen);
		mv.addObject("errormsg", errormsg);
		mv.addObject("msg", msg);
		mv.addObject("formatdatum", formatdatum);
		mv.setViewName("home");
		return mv;
	}

	public static Logger getLog() {
		return log;
	}

	public static void setLog(Logger log) {
		AnfrageController.log = log;
	}

}
